package job

import (
	"time"

	"github.com/gin-gonic/gin"
	"go-api-template/api/http"
	"go-api-template/api/models/system"
	"go-api-template/internal/task"
	"go-api-template/service"
)

type CreateReq struct {
	Name        string    `json:"name" binding:"required"`     // 定时任务名称
	Type        int8      `json:"type" binding:"required"`     // 任务类型 1单次任务 2周期性任务
	TableId     int64     `json:"table_id" binding:"required"` // 报表数据表主键ID
	StartTime   time.Time `json:"start_time"`                  // 定时任务执行时间段的开始时间
	EndTime     time.Time `json:"end_time"`                    // 定时任务执行时间段的截止时间
	Cycle       int8      `json:"cycle"`                       // 周期频率 1分 2时 3日 4月 5周
	ExprMinute  int       `json:"expr_minute"`                 // 分钟 取值0~59
	ExprHour    int       `json:"expr_hour"`                   // 小时 取值0~23
	ExprDay     int       `json:"expr_day"`                    // 日 取值范围1~31
	ExprMonth   int       `json:"expr_month"`                  // 月 取值范围1~12
	ExprWeek    int       `json:"expr_week"`                   // 周 取值范围1~53
	ExecuteTime time.Time `json:"execute_time"`                // 执行时间
	ApiId       string    `json:"api_id"`
	ParamJson   string    `json:"param_json"` // 接口请求参数
	UserId      string    `json:"-"`
}
type CreateResp struct {
}

func (req *CreateReq) Request(ctx *gin.Context, s *service.Service) (http.Resp, error) {
	req.UserId = ctx.GetString("user_id")
	return req.Do(ctx, s)
}
func (req *CreateReq) Do(ctx *gin.Context, s *service.Service) (resp http.Resp, err error) {
	var data CreateResp
	cronExpr := system.CronExpr{
		Name:         req.Name,
		CreateUserId: req.UserId,
		ApiId:        req.ApiId,
		ParamJson:    req.ParamJson,
		Cycle:        req.Cycle,
		ExprMinute:   req.ExprMinute,
		ExprHour:     req.ExprHour,
		ExprDay:      req.ExprDay,
		ExprMonth:    req.ExprMonth,
		ExprWeek:     req.ExprWeek,
		StartTime:    int(req.StartTime.UnixNano() / 1e6),
		EndTime:      int(req.EndTime.UnixNano() / 1e6),
		Status:       2,
	}
	s.Db.Create(&cronExpr)
	cronExpr.SetExpression()

	entryId, err := s.Cron.AddFunc(cronExpr.Expression, task.ApiJob{}.Run)
	if err != nil {
		return
	}
	s.Db.Where("id = ?", cronExpr.ID).Update("entry_id", entryId)

	resp.SetData(data)
	return
}

type ListReq struct {
	Name string `form:"name"` // 任务名
}
type ListRespItem struct {
	ID   string `json:"id"`
	Name string `json:"name"`
}
type ListResp struct {
	http.RespList[ListRespItem]
}

func (req *ListReq) Request(ctx *gin.Context, s *service.Service) (http.Resp, error) {
	return req.Do(ctx, s)
}
func (req *ListReq) Do(ctx *gin.Context, s *service.Service) (resp http.Resp, err error) {
	var data ListResp

	resp.SetData(data)
	return
}
